package br.com.sms.action;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.struts2.ServletActionContext;

import br.com.sms.dominio.Cliente;
import br.com.sms.dominio.Perfil;
import br.com.sms.dominio.Usuario;
import br.com.sms.enuns.SEXO;
import br.com.sms.enuns.Situacao;
import br.com.sms.enuns.UF;
import br.com.sms.excecao.SmsException;
import br.com.sms.util.DataUtil;
import br.com.sms.util.Mensagens;

import com.opensymphony.xwork2.ActionContext;

public class UsuarioAction extends Action {

	private List<Usuario> usuarios;
	private String nome;
	private Situacao[] situacoes = Situacao.values();
	private SEXO[] sexos = SEXO.values();
	private UF[] ufs = UF.values();
	private String confirmaSenha;
	private Usuario usuario;
	private List<Perfil> perfis;
	private Situacao situacao;
	private List<Cliente> clientes;


	public String novoUsuario(){
		if(isAdminGeral()){
			this.perfis = getPerfilFacade().recuperarPerfis();
			clientes = getClienteFacade().recuperarTodos();
		}else
			this.perfis = getPerfilFacade().recuperarPerfis(getCliente());
				
		return TELA_NOVO_USUARIO;
	}

	public String salvarUsuario(){

		try {
			getUsuarioFacade().validaCamposUsuario(this.usuario, confirmaSenha);
			
			if(isAdminGeral())
				this.usuario.setCliente(getClienteFacade().recuperarCliente(this.usuario.getCliente().getId()));
			else
				this.usuario.setCliente(getUsuarioLogado().getCliente());
			
			getUsuarioFacade().salvarUsuario(this.usuario);
			
			mensagens.put("mensagem", Mensagens.USUARIO_CADASTRADO_SUCESSO);
			apresentarMensagens();
			
			return LISTAR_USUARIOS;
		} catch (SmsException e) {
			erros.put("erro", e.getMessage());
			apresentarErros();
			novoUsuario();
			return TELA_CADASTRO_USUARIO;
		}
	}

	public String listarUsuario(){
		if (situacao == null)
			situacao = Situacao.ATIVO;
		
		if(isAdminGeral())
			this.usuarios = getUsuarioFacade().recuperarUsuarios(nome, null, null); 
		
		else
			this.usuarios = getUsuarioFacade().recuperarUsuarios(nome, situacao, getUsuarioLogado().getCliente());
		
		ServletActionContext.getRequest().setAttribute("usuarios", this.usuarios);
		return TELA_LISTA_USUARIO;
	}
	
	public String excluirUsuario(){
		setMenuAtual(MENU_ADMINISTRACAO);
		getUsuarioFacade().excluirUsuario(usuario);
		return LISTAR_USUARIOS;
	}
	
	public String carregarUsuarioEdicao(){
		setMenuAtual(MENU_ADMINISTRACAO);
		this.usuario = getUsuarioFacade().recuperarUsuario(this.usuario.getId());
		this.usuario.setDataNascimentoString(DataUtil.getDataFormatadaSemHoras(this.usuario.getDataNascimento()));
		this.perfis = getPerfilFacade().recuperarPerfis();

		if(isAdminGeral())
			clientes = getClienteFacade().recuperarTodos();
		
		return TELA_CADASTRO_USUARIO;
	}

	

	private List<Integer> getSelecionados(){
		List<Integer> marcados = new ArrayList<Integer>();
		//pego todas as chaves dos parâmetros

		Map<String, Object> parametros = ActionContext.getContext().getParameters();

		if(parametros != null){
			for (Object chave : parametros.keySet()){
				//aqueleas que começam por "role-"
				if (String.valueOf(chave).startsWith("tipo-")){
					//quebro a String pelo token -, e pego a segunda posicao que contém o saram
					String codigoDest = String.valueOf(chave).split("-")[1];
					//recupero o conteúdo do checkbox
					Object obj = ActionContext.getContext().getParameters().get("tipo-"+codigoDest);

					String[] opcao = null;
					//se ele for um String[] é por que foi submetido corretamente
					if (obj instanceof String[]){
						opcao = (String[]) obj;
					}
					//verifico se o conteúdo do checkbox é true, ou seja, foi selecionado
					if (opcao != null && opcao[0].equalsIgnoreCase("true")){
						marcados.add(Integer.parseInt(codigoDest));
					}
				}
			}
		}
		return marcados;
	}


	/*Get & Set*/

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Situacao[] getSituacoes() {
		return situacoes;
	}

	public void setSituacoes(Situacao[] situacoes) {
		this.situacoes = situacoes;
	}

	public String getConfirmaSenha() {
		return confirmaSenha;
	}

	public void setConfirmaSenha(String confirmaSenha) {
		this.confirmaSenha = confirmaSenha;
	}

	public List<Perfil> getPerfis() {
		return perfis;
	}

	public void setPerfis(List<Perfil> perfis) {
		this.perfis = perfis;
	}

	public SEXO[] getSexos() {
		return sexos;
	}

	public void setSexos(SEXO[] sexos) {
		this.sexos = sexos;
	}

	public UF[] getUfs() {
		return ufs;
	}

	public void setUfs(UF[] ufs) {
		this.ufs = ufs;
	}

	public Situacao getSituacao() {
		return situacao;
	}

	public void setSituacao(Situacao situacao) {
		this.situacao = situacao;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}
	
	
}
